from git import Repo
from datetime import datetime
from pathlib import Path
import ast

gitee_link = "https://gitee.com/"
repo_name = "APIJSON"
repo_link = gitee_link + "tencent/APIJSON"
commits_link = gitee_link + "Tencent/APIJSON/commits/master"
authors_link = gitee_link + "Tencent/APIJSON/contributors"
branches_link = gitee_link + "Tencent/APIJSON/branches"
branch_link = gitee_link + "Tencent/APIJSON/tree/"

md = f"# {repo_name} Project Data Analysis\n\n"
md += "---\n\n"

if Path(repo_name).exists():
    repo = Repo(repo_name)
else:
    print("Cloning repo...")
    repo = Repo.clone_from(repo_link, repo_name)
    print("Finished cloning!")

repo_commits = list(repo.iter_commits())
first_commit = repo_commits[-1]
latest_commit = repo_commits[0]
start_date = datetime.fromtimestamp(first_commit.authored_date)
latest_date = datetime.fromtimestamp(first_commit.authored_date)

md +=f"**Start Date:** {start_date}\n\n"
md +=f"**Latest Update:** {latest_date}\n\n"
md +=f"[**Commits:** {len(repo_commits)}]({commits_link})\n\n"

gitee = repo.remotes[0]
gitee_branches = [
    ref.name[7:] for ref in gitee.refs if ref.name != "origin/HEAD"
]
gitee_branches.remove("master")
repo_branches = ["master"] + gitee_branches

md += f"[**Branches:** {len(repo_branches)}]({branches_link})\n\n"

author_data = {}
for commit in repo_commits:
    print(commit.stats.total)

    author = commit.author.name
    if author not in author_data:
        author_data[author] = 1
    else:
        author_data[author] += 1

author_count = sorted(author_data.items(),
                          key=lambda data: data[1], reverse=True)
md += f"[**Authors:** {len(author_data)}]({authors_link})\n\n"

md += "## Branches\n\n"
for branch in repo_branches:
    md += f" - [{branch}]({branch_link + branch}\n\n"

md += "## Top 10 Authors: \n\n"
for i in range(10):
    author = author_data[i]
    name = author[0].replace(" ", "")
    commits = author[1]

    md += f"{i + 1}. [{name}]({gitee_link + name}): {commits} commits\n\n"
Path("report.md").write_text(md, "UTF-8")